# 面向对象的三大特征
# 封装、继承、多态
class Dog():
    def __init__(self,name,color):
        self.name=name;
        self.__color=color;

    def eat(self):
        print(self.name,"吃饭了...");

    def __run(self):
        print("一只",self.__color,"的🐕跑了...");

'-------------------------------------- 封装 --------------------------------------';
# 在Python中并没有修饰符，如果希望是私有的，在属性/方法，或者方法前面加入两个 __，即可，但是也可以强制访问
dog = Dog("老黑","黑色");
dog.eat();

print(dir(dog));

# print(dog.__color);
print(dog._Dog__color); # 强制访问

# print(dog.__run);
dog._Dog__run();# 强制访问

'-------------------------------------- 继承 --------------------------------------';
# 支持多继承
# 必须在子类中调用父类的构造函数

# 动物类
class Animal():
    def __init__(self,name,color,age):
        self.name = name;
        self.color = color;
        self.age = age;

    def eat(self):
        print(self.name,"吃饭了...");

    def run(self):
        print("名字：{},颜色：{},age:{}".format(self.name,self.color,self.age));


class Dog(Animal):
    def __init__(self,name,color,age):
        super().__init__(name,color,age);



dog = Dog("牛牛",'黑色',5);
dog.run(); # Dog 类中并没有run方法，是继承自父类的

def run():
    print("跑不动了...");

dog.run = run;
dog.run(); # 调用的是方法重写后的 run()

print(dog.name);


'-------------------------------------- 多态 --------------------------------------';
# Java 多态
'''
    1.继承
    2.重写
    3.父类引用指向子类对象
'''
# Python 中的多态，与Java中的多态完全不一样
# Python 是动态语言，且 数据类型不 固定， age = 33; age = "666"
# 所以Python中的多态主要以行为为主

# 但是 没理解出是多态行为，理解到的是 js中的 trigger() 方法
class Student():
    def __init__(self,name):
        self.name = name;

    def eat(self,name):
        print(f"{self.name}吃饭了");

class Mall():
    def __init__(self,name):
        self.name = name;

    def eat(self,name):
        print(f"{self.name}吃饭了");

def fun(obj):
    obj.eat(obj.name);

fun(Student("学生"));
fun(Mall("商人"));
